题意:有一只甲虫处于一根水平的树枝。因为他沉迷数学无法自拔,所以他觉得很像是在 $x$ 轴上。
在同一根树枝上,还有 $n$ 滴露水。每滴露水占用 $m$ 个单位的水分。相对于甲虫的位置,他们的坐标分别是 $x_1,x_2,\dots,x_n$。
显然,这一天将会骄阳似火。每过一个时间单位,就会有一个单位的水分从每一滴露水流失。这只甲虫受尽了烈阳的折磨,以至于每当它碰到一滴露水都能瞬间喝完。在每个时间单位中它能移动一个单位的距离。
所以你要写一个程序,根据露水的坐标,计算出甲虫最多能喝到的水。
$0 \le n \le 300,1 \le m \le 1,000,000,-10,000 \le x_1,x_2,\dots,x_n \le 10,000,$ 对于所有 $i \ne j,x_i \ne x_j$。
这道题应该一眼就能看出是区间$DP$,但是关键在于怎么写,我们用$f[i][j][0/1]$表示取完$i$~$j$之间的露水,停在$i$或$j$浪费的水分,因为露水水分不可能为负数,而走到后来可能行走路程$>m$,使得计算出的水分为负,所以我们要枚举取的总的露水数$p$(注意不是水分数)
于是我们可以列出状态转移方程:
$f[i][j][0]=min(f[i+1][j][0]+(p-len+1)\times(a[i+1]-a[i]),f[i+1][j][1]+(p-len+1)\times(a[j]-a[i]));$
$f[i][j][1]=min(f[i][j-1][1]+(p-len+1)\times(a[j]-a[j-1]),f[i][j-1][0]+(p-len+1)\times(a[j]-a[i]));$
$len$为$j-i+1$,即当前采集的露水数
1 |
|